/* 非线程安全版strerror()测试 */
#define _GNU_SOURCE

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>

#define MAX_ERROR_LENGTH 256

static char buf[MAX_ERROR_LENGTH];

/* 修改名称，防止重名 */
static char *my_strerror(int errnum)
{
    if (errnum < 0 || errnum >= _sys_nerr || NULL == _sys_errlist[errnum]) {
        snprintf(buf, MAX_ERROR_LENGTH, "Unknown error %d", errnum);
    } else {
        strncpy(buf, _sys_errlist[errnum], MAX_ERROR_LENGTH - 1);
        buf[MAX_ERROR_LENGTH - 1] = '\0'; /* 终止字符 */
    }

    return buf;
}

static void *thread_start(void *arg)
{
    char *str = my_strerror(2); /* 获取错误编号为2的错误描述信息 */
    printf("子线程:str(%p)=%s\n", str, str);
    pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
    pthread_t tid;
    char *str = NULL;
    int ret;

    str = my_strerror(1); /* 获取错误编号为1的错误描述信息 */

    /* 创建子线程 */
    ret = pthread_create(&tid, NULL, thread_start, NULL);
    if (ret) {
        fprintf(stderr, "pthread_create error: %d\n", ret);
        exit(-1);
    }

    /* 等待回收子线程 */
    if (ret = pthread_join(tid, NULL)) {
        fprintf(stderr, "pthread_join error: %d\n", ret);
        exit(-1);
    }

    printf("主线程:str(%p)=%s\n", str, str);
    exit(0);
}
